from django.http import JsonResponse
from django.views.decorators.http import require_GET
from django.views.decorators.csrf import csrf_exempt
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

from datastats.models import DataStats
from services.stats_service import StatsService


class StatsQueryView(APIView):
    """统计数据查询接口"""

    def get(self, request):
        """
        查询统计数据
        请求参数：
        - period: 统计周期（1=日，2=周，3=月）
        - stats_date: 统计日期（格式YYYY-MM-DD，日统计传具体日期，周统计传周日，月统计传月底）
        - stats_type: 统计类型（1=业务指标，2=合规指标，3=互动指标，默认返回全部）
        """
        try:
            # 解析参数
            period = int(request.query_params.get("period", 1))
            stats_date_str = request.query_params.get("stats_date")
            stats_type = int(request.query_params.get("stats_type", 0))

            # 校验参数
            if period not in [1, 2, 3]:
                return Response(
                    {"error": "统计周期无效（1=日，2=周，3=月）"},
                    status=status.HTTP_400_BAD_REQUEST
                )
            if not stats_date_str:
                return Response(
                    {"error": "请传入统计日期（stats_date）"},
                    status=status.HTTP_400_BAD_REQUEST
                )

            # 转换日期格式
            from datetime import datetime
            stats_date = datetime.strptime(stats_date_str, "%Y-%m-%d").date()

            # 查询统计数据
            stats_obj = DataStats.objects.filter(
                period=period, stats_date=stats_date
            ).first()

            if not stats_obj:
                # 若未统计，手动触发一次（应急用）
                StatsService.run_stats(period=period, stats_date=stats_date)
                stats_obj = DataStats.objects.filter(period=period, stats_date=stats_date).first()

            # 组装返回数据
            result = {
                "period": period,
                "period_name": StatsService.get_period_display(period),
                "stats_date": stats_date_str,
                "data": {}
            }

            if stats_type == 1 or stats_type == 0:
                result["data"]["business"] = stats_obj.business_data
            if stats_type == 2 or stats_type == 0:
                result["data"]["compliance"] = stats_obj.compliance_data
            if stats_type == 3 or stats_type == 0:
                result["data"]["interaction"] = stats_obj.interaction_data

            return Response({"code": 200, "msg": "查询成功", "data": result})

        except ValueError:
            return Response(
                {"error": "日期格式无效（需YYYY-MM-DD）"},
                status=status.HTTP_400_BAD_REQUEST
            )
        except Exception as e:
            import logging
            logging.error(f"统计数据查询异常：{str(e)}", exc_info=True)
            return Response(
                {"error": "服务器内部错误"},
                status=status.HTTP_500_INTERNAL_SERVER_ERROR
            )